package com.itheima.reggie.controller;


import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 菜品管理
 */
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.path}")
    private String path;    //配置文件中图片保存路径

    /**
     * 图片上传
     * (用户将图片上传后,我们需要将图片保存到本地文件中,后续查看指定图片时才能正常返回)
     *
     * @param file
     * @return
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {    //MultipartFilter file为指定格式,前端上传图片的name为file,此处就得填file
        log.info("接收到图片:{}", file.toString());   // 测试是否能正常接收到上传文件

        // 获取原始文件名称(可以直接使用原始文件名称,但为防止多次上传的文件可能存在重复名,文件覆盖问题,所以我们自己重写生成名称)
        String filename = file.getOriginalFilename();
        String substring = filename.substring(filename.lastIndexOf("."));   //获取文件原名称的文件类型

        // 使用UUID生成随机名称
        String randomName = UUID.randomUUID().toString();
        // 将名称和类型拼接(随机生成名称 + 原文件类型)
        String newFileName = randomName + substring;

        // 判断以下路劲是否存在
        File file1 = new File(path);
        if (!file1.exists()) {   // 如果配置路劲不存在
            file1.mkdirs();     // 创建配置路劲文件夹
        }

        try {
            // 将上传的图片下载到本地中保存(后续需要将图片和指定内容返回给浏览器)
            file.transferTo(new File(path + newFileName));
        } catch (IOException e) {
            e.printStackTrace();
        }

        log.info("图片下载成功,地址:{}", path);
        // 下载成功后,需要返回该图片的名称,需要在浏览器上显示
        return R.success(newFileName);
    }


    /**
     * 图片下载
     * (将图片信息返回给浏览器)
     *
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {
        try {
            // 读取本地文件中保存的图片信息
            FileInputStream fileInputStream = new FileInputStream(path + name);
            // 将读取到的图片信息输出到浏览器中
            ServletOutputStream outputStream = response.getOutputStream();

            int len = 0;    // 定义读取长度
            byte[] bytes = new byte[1024];  // 定义接收容器
            while ((len = fileInputStream.read(bytes)) != -1) {     // 如果从本地文件中读取的长度不为-1,表示信息没有读取完
                outputStream.write(bytes,0,len);    // 将数据输出到浏览器中
            }
            // 关流,释放资源
            fileInputStream.close();
            outputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
